package org.succlz123.s1go.app.utils.fromhtml; import org.succlz123.s1go.app.ui.picture.PictureActivity; import android.text.Layout; import android.text.Spannable; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.style.ImageSpan; import android.view.MotionEvent; import android.widget.TextView; /** * Created by succlz123 on 2015/4/17. */ public class ImageLinkParser extends LinkMovementMethod { private static final ImageLinkParser instance = new ImageLinkParser(); public static ImageLinkParser getInstance() { return instance; } private boolean find = false; private ImageSpan findSpan = null; @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { Layout layout = widget.getLayout(); if (layout == null) { return super.onTouchEvent(widget, buffer, event); } int x = (int) event.getX(); int y = (int) event.getY(); int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); SpannableString value = SpannableString.valueOf(widget.getText()); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: findSpan = null; ImageSpan[] imageSpans = value.getSpans(0, value.length(), ImageSpan.class); int findStart = 0; int findEnd = 0; for (ImageSpan imageSpan : imageSpans) { int start = value.getSpanStart(imageSpan); int end = value.getSpanEnd(imageSpan); if (start <= offset && offset <= end) { find = true; findStart = start; findEnd = end; findSpan = imageSpan; break; } } return find || super.onTouchEvent(widget, buffer, event); case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_CANCEL: findSpan = null; break; case MotionEvent.ACTION_UP: if (findSpan != null) { String url = findSpan.getSource(); if (url.startsWith("static/image/smiley/")) { return false; } PictureActivity.start(widget.getContext(), url); return true; } } return super.onTouchEvent(widget, buffer, event); } }